package main

import (
	"fmt"
	"reflect"
)

type User09 struct {
	Name string
	Age  int
}

func (u *User09) UpdateNameAndAge(name string, age int) {
	u.Name = name
	u.Age = age
}

func (u *User09) GetUserInfo() string {
	return fmt.Sprintf("%v", *u)
}

func main() {
	u := &User09{
		Name: "A",
		Age:  18,
	}
	//一定要传递指针类型数据
	valInfo := reflect.ValueOf(u)
	methodInfo := valInfo.MethodByName("GetUserInfo")
	resValue := methodInfo.Call(nil)
	fmt.Printf("%v\n", resValue[0])

	updateMethodInfo := valInfo.MethodByName("UpdateNameAndAge")

	//反射调用函数是，需要传递参数，参数为变量信息
	args := []reflect.Value{reflect.ValueOf("B"), reflect.ValueOf(20)}
	//如果函数返回为空，则反射调用的返回数据未空切片，切片中的类型是reflect.Value
	updateRes := updateMethodInfo.Call(args)
	fmt.Printf("%v，%T\n", updateRes, updateRes)
	fmt.Println(u)
}
